עמוד 1 מתוך 11 מספר סידורי: בחינה בתוכנה 1 גרסה 1 סמסטר ב' תשע"ה, מועד א', 13 יולי 5112 יעל אמסטרדמר, סיון טולדו, דביר נתנאלי משך הבחינה שלוש שעות. יש להניח שהקוד שמופיע במבחן הוא בגרסה 8 של ג'אווה. יש לסמן את התשובה הטובה ביותר בתשובון. הבחינה או במחברת הבחינה. לא יינתן ניקוד על סימון תשובה בטופס יש לנמק כל תשובה בטופס הבחינה. נימוק חסר או לא נכון עלול לגרום לאי קבלת נקודות על שאלה גם אם התשובה המסומנת היא הטובה ביותר. המקום המיועד לנימוקים בגוף הבחינה מספיק לתשובות תמציתיות. יש לצרף את טופס המבחן למחברת הבחינה. במחברת הבחינה לא תיבדקנה. מחברת ללא טופס עזר תפסל. תשובות יש למלא מספר סידורי )מספר מחברת( ומספר ת"ז על כל דף של טופס הבחינה. אסור השימוש בחומר עזר כלשהו, כולל מחשבונים או כל מכשיר אחר פרט לעט. כל הזכויות שמורות למחברים. מבלי לפגוע באמור לעיל, אין להעתיק, לצלם, להקליט, לשדר, לאחסן במאגר מידע, בכל דרך שהיא, בין מכנית ובין אלקטרונית או בכל דרך אחרת כל חלק שהוא מטופס הבחינה. בהצלחה! שאלה )4 1 נק'( באיזה מחלקת אוסף נשתמש כדי לשמור עצמים כאשר הם ממויינים על פי סדר מסויים? א. HashSet ב. LinkedHashSet ג. Array ד. TreeSet
עמוד 5 מתוך 11 מספר סידורי: שאלה )4 2 נק'( איזה מהבאים אינו יתרון של מחלקה פנימית אנונימית? א. משפרת קריאות הקוד ע"י הצמדת קוד המחלקה הפנימית למקום השימוש ב. מאפשרת גישה לשדות פרטיים במחלקה העוטפת וחוסכת כתיבת קוד ג. משפרת את זמן הריצה של התוכנית היות ולא נדרשים שלבי האתחול של מחלקה רגילה ד. מאפשרת לצמצמם את מספר קבצי הקוד בפרוייקט ומקילה על ההתמצאות בתיקיית הפרוייקט try { Scanner scanner = new Scanner(System.in); while (scanner.hasnextline()) { System.out.println(scanner.nextLine()); catch (Exception e) { שאלה )4 3 נק'( נתון הקוד הבא: כאשר נריץ את הקוד, א.הקוד יקרא את כל הקלט מן המשתמש ויסתיים כאשר הוא יקיש Enter ב.הקוד יקרא את כל הקלט מקובץ ויסתיים כאשר יגיע לסוף הקובץ ג. הקוד לא יתקמפל ד.אף אחת מהתשובות האחרות לא נכונה השאלות הבאות מתייחסות לקוד הבא שהשירותים שמוגדרים בו אמורים לחשב קירוב ללוגריתם של מספר אי שלילי. בשאלות יש לבחור תשובות שמשמרות עד כמה שאפשר את הכוונה של מפתח הקוד, כלומר לשמר את היכולת לחשב קירובים ללוגריתמים. למשל, תשובה שמבוססת על שינוי תנאי הקדם כך שלעולם לא יתקיים איננה תשובה טובה. הגרף של פונקציית הלוגריתם מופיע משמאל.
עמוד 3 מתוך 11 מספר סידורי: public class LogAsLong { /** @pre x >= 1 * @post $ret <= log(x) <= $ret + 1 */ public static long log(int x) {...... public class LogAsInt extends LogAsLong { /** @pre x >= 1 * @post $ret <= log(x) <= $ret + 1 */ public static int logofnonnegative(int x) {...... שאלה )4 4 נק'( השאלה הזאת תקפה באותה מידה לשתי המחלקות. א. החוזה של log תקין כמו שהוא )כלומר מאפשר מימוש של השירות כך שיקיים את החוזה( ב. החוזה יהיה תקין אם נוסיף לו עוד תנאי שמגביל את הארגומנט x ג. החוזה יהיה תקין אם נוסיף לו תנאי, אבל אין צורך להגביל את x בתנאי הזה שאלה )4 5 נק'( תנאי האחר בשירות של LogAsInt א. מחזק את תנאי האחר של השירות ב- LogAsLong ב. מחליש את תנאי האחר של השירות ב- LogAsLong ומכיון ש- LogAsInt את,LogAsLong החלשה כזאת היא לא תקינה ג. מחליש את תנאי האחר של השירות ב- LogAsLong ד. אינו מחליש ואינו מחזק את תנאי האחר של השירות ב- LogAsLong מרחיבה
עמוד 4 מתוך 11 מספר סידורי: Stream<String> stream =...; stream.filter( s -> s.contains("x") ).sorted().foreach( System.out::println ); שאלה )4 6 נק'( השאלה הבאה מתייחסת לקוד הבא. בהנחה שהקוד שמאתחל את ה-< Stream<String תקין )עובר קומפילציה ולא זורק חריג בזמן ריצה(. שאר הקוד א. לא יתקמפל בגלל בעיה בשורה שקוראת ל- filter ב. לא יתקמפל בגלל בעיה בשורה שקוראת ל- foreach ג. יתקמפל ואם ירוץ בלי לזרוק חריג, בכל שורה בפלט יופיע התו X ד. יתקמפל אבל גם אם ירוץ בלי לזרוק חריג, בפלט עלולה להופיע שורה בלי התו X public class Test { private class Ex extends RuntimeException { שאלה )4 7 נק'( השאלה הבאה מתייחסת לקוד הבא. public void f() { throw new Ex(); א. ב. ג. ד. הקוד לא יתקמפל מכיון שהשירות זורק חריג ממחלקה פרטית; אפשר לתקן את הבעיה הזאת על ידי שינוי private ל- public הקוד לא יתקמפל מכיון שהשירות לא תופס את החריג ולא מכריז עליו; אפשר לתקן את הבעיה הזאת על ידי הוספת פסוק throws להגדרה של f גם א' וגם ב' נכונות הקוד יתקמפל כפי שהוא
עמוד 2 מתוך 11 מספר סידורי: שאלה )4 8 נק'( השאלה הבאה מתייחסות לקוד הבא. הקוד שמאתחל את x יוצר HashSet של 3 קבוצות שבראשונה 2 מחרוזות )שהן y(, x, בשניה מחרוזת אחת )z(, והשלישית ריקה. Set< Set<String> > sss =...; int n=0; for (Set<String> s: sss) { Iterator<String> i = s.iterator(); while (i.hasnext()) n++; System.out.printf("set %d string %s\n",n,i.next()); בהנחה שהקוד שמאתחל את x תקין )עובר קומפילציה ולא זורק חריג(. שאר הקוד א. לא יתקמפל ב. יתקמפל וידפיס תמיד את שלוש השורות set 0 string x set 0 string y set 0 string z ג. יתקמפל וידפיס תמיד את שלוש השורות set 0 string x set 0 string y set 1 string z ד. אף תשובה אחרת לא נכונה נימוק שאלה )4 9 נק'(: נתון המנשק הבא איזה משני השירותים הבאים ניתן public interface I { public void foo(string s); להוסיף למנשק כך שהקוד יתקמפל ללא שגיאות? int foo(object o); /* A */ void foo(object o2); /* B */ א. ב. ג. ד. ה. ו. אי אפשר להוסיף אף אחד מהם רק את השירות המסומן A רק את השירות המסומן B אפשר להוסיף את A ואפשר להוסיף את B אבל לא את שניהם ביחד אפשר להוסיף כל אחד מהם או להוסיף את שניהם ביחד אפשר להוסיף את A וגם את B אבל לא אחד מהם לבד
עמוד 1 מתוך 11 מספר סידורי: public class A extends B { public A(int m, int n) { super(m,n); System.out.println(m-n); השאלה הבאה מתייחסת לקוד הבא public class B extends A { public B(int a, int b) { super(a,b); System.out.println(a*b); הרצה של main ז. תדפיס את המספרים 1 ו- 51 ח. תדפיס את המספרים 15 ו- 51 ט. תדפיס את המספרים 15 ו- 51 י. תדפיס את המספרים 1 ו- 1 יא. התוכנית תגרום לשגיאת קומפילציה יב. התוכנית תגרום לשגיאת זמן ריצה public static void main(string[] args) { A a1 = new A(3,2); A a2 = new B(5,4); עליך להמיר קוד משפת ++C שבה יש מנגנון של ירושה מרובה לשפת ג'אווה. הקוד שעליך להמיר כולל שלוש מחלקות ששתיים מהן אינן יורשות מאף מחלקה אבל השלישית יורשת משתיהן. המרה סבירה לג'אווה תתבסס על א. ירושה והכלה ב. טיפוסים מוכללים,generics( כמו )HashSet<String> ג. שיגור דינמי ד. חריגים
עמוד 7 מתוך 11 מספר סידורי: שתי השאלות הבאות מתייחסות לקוד הבא. public class A { public Integer findmaxfromindex(arraylist<integer> list, int startingindex) throws IllegalArgumentException {... public class B extends A { protected Integer findmaxfromindex(arraylist<integer> list, // 1 int startingindex) throws IllegalArgumentException {... public Integer findmaxfromindex(arraylist<integer> mylist, // 2 int startingindex) {... public class C extends A { public Integer findmaxfromindex(linkedlist<integer> list, // 3 int startingindex) throws Exception {... Public float findmaxfromindex(list<float> mylist, // 4 int startingindex) throws IllegalArgumentException{... איזה מהשירותים הממוספרים אפשר לכלול במחלקה B מבלי לגרום לשגיאת קומפילציה? א. 1 ב. 5 ג. 1 וגם 5 )שני השירותים יכולים להיות מוגדרים ביחד( ד. 1 או 5 אבל לא את שניהם ביחד ה. אף אחד מהם איזה מהשירותים הממוספרים אפשר לכלול במחלקה C מבלי לגרום לשגיאת קומפילציה? א. 3 ב. 4 ג. 3 וגם 4 )שני השירותים יכולים להיות מוגדרים ביחד( ד. 3 או 4 אבל לא את שניהם ביחד ה. אף אחד מהם
עמוד 8 מתוך 11 מספר סידורי: 2 השאלות הבאות מתייחסות לקוד הבא. public class A { private void print() { System.out.print(foo() + " "); public String foo() { return "AAA"; public static void main(string[] args) { A[] arr = { new A(), new B() ; for (int i = 0; i < 2; i++) { /***/ public class B extends A { private void print() { System.out.println("%" + foo() + " "); public String foo() { return "BBB"; public void bar() { print(); שאלה )4 14 נק'( מה יקרה כשנריץ את main )אם התוכנית תתקמפל בכלל( אם נחליף את גוף הלולאה )מסומן ב-/***/( בקוד A a = arr[i]; a.print(); א. יודפס AAA AAA ב. יודפס AAA BBB ג. יודפס AAA %BBB ד. יודפס %BBB %BBB ה. התוכנית לא תעבור קומפילציה ו. התוכנית תזרוק חריג בזמן ריצה
עמוד 9 מתוך 11 מספר סידורי: מה יקרה כשנריץ את main )אם התוכנית תתקמפל בכלל( אם נחליף את גוף הלולאה )מסומן ב-/***/( בקוד arr[i + 1] = arr[i]; arr[i + 1].print(); א. יודפס AAA AAA ב. יודפס AAA BBB ג. יודפס AAA %BBB ד. יודפס %BBB %BBB ה. התוכנית לא תעבור קומפילציה ו. התוכנית תזרוק חריג בזמן ריצה )4 11 נק'( שאלה מה יקרה כשנריץ את main )אם התוכנית תתקמפל בכלל( אם נחליף את גוף הלולאה )מסומן ב-/***/( בקוד if (i == 0) { print(); יודפס AAA א. יודפס %AAA ב. יודפס BBB ג. יודפס %BBB ד. התוכנית לא תעבור קומפילציה ה. התוכנית תזרוק חריג בזמן ריצה ו.
עמוד 11 מתוך 11 מספר סידורי: שאלה )4 11 נק( מה יקרה כשנריץ את main )אם התוכנית תתקמפל בכלל( אם נחליף את גוף הלולאה )מסומן ב-/***/( בקוד if (arr[i] instanceof A) { System.out.print(arr[i].foo() + " "); א. יודפס AAA ב. יודפס AAA AAA ג. יודפס AAA BBB ד. יודפס BBB ה. התוכנית לא תעבור קומפילציה ו. התוכנית תזרוק חריג בזמן ריצה שאלה 4( 11 נק'( מה יקרה כשנריץ את main )אם התוכנית תתקמפל בכלל( אם נחליף את גוף הלולאה )מסומן ב-/***/( בקוד B b = new B() { public void bar() { System.out.print("#" + arr[i].foo() + " "); ; b.bar(); א. יודפס #AAA #AAA ב. יודפס #AAA #BBB ג. יודפס %AAA %BBB ד. יודפס %BBB %BBB ה. התוכנית לא תעבור קומפילציה ו. התוכנית תזרוק חריג בזמן ריצה
עמוד 11 מתוך 11 מספר סידורי: שתי השאלות הבאות מתייחסות לקוד הבא. public abstract class Filter<T> { protected abstract boolean cond(t t); public void filter(collection<t> col) { for (Iterator<T> iter = col.iterator(); iter.hasnext();) { T t = iter.next(); if (!cond(t)) iter.remove(); שאלה )4 19 נק'( נתבונן על הקוד הנתון למעלה של.Filter<T> איזו מבין המחלקות הבאות יכולה לרשת מ-< Filter<T ולשמש אותנו כפילטר של מחרוזות? )קוד המחלקה אינו נתון( א. {... Filter<T> public class StringFilter extends ב. {... Filter<T> public class StringFilter<String> extends ג. {... Filter<String> public class StringFilter<String> extends ד. {... Filter<String> public class StringFilter extends public class SubFilter<T> extends Filter<T> { protected boolean cond(t t) { return (t!= null); נתבונן על הקוד הנתון של SubFilter<T> היורשת מ-< Filter<T. ניצור מופע שלה כך: SubFilter<List<String>> sub = new SubFilter<>(); מה מהבאים אינו נכון לגבי?sub א. ב. ג. ד. ניתן להשתמש בו כדי להסיר null מרשימות של מחרוזות ניתן להשתמש בו כדי להסיר null מאוסף של רשימות של מחרוזות המתודה filter של sub תשנה רק אוספים המכילים null המתודה filter של sub לא תשנה אוספים ריקים
עמוד 15 מתוך 11 מספר סידורי: מקבץ שאלות GUI השאלות הבאות מתייחסות לקוד הבא. public class GUIclass { private final static int N = 3; private static Integer[] nums = new Integer[]{0,0,0; private static Text[] texts = new Text[N]; private static [] buttons = new [N]; public static void main(string[] args) { Display display = Display.getDefault(); Shell shell = new Shell(display); // N columns, equal width shell.setlayout(new GridLayout(N, true)); for (int i=0; i<n; i++) { texts[i]=new Text(shell, SWT.LEFT); texts[i].settext(integer.tostring(i)); for (int i=0; i<n; i++) { buttons[i]=new (shell, SWT.PUSH); buttons[i].settext("" + Integer.toString(i)); /*** MISSING CODE ***/ shell.pack(); shell.open(); while (!shell.isdisposed()) { if (!display.readanddispatch()) { display.sleep(); display.dispose(); private static void addlisteners1() { SelectionListener sl = new SelectionAdapter() { int m=0; public void widgetselected(selectionevent e) { for (int i=0; i<n; i++) texts[i].settext(integer.tostring(nums[i]+m)); m++; ; buttons[0].addselectionlistener(sl);
עמוד 13 מתוך 11 מספר סידורי: private static void addlisteners2() { for (int i=0; i<n; i++) { final int j= i; buttons[i].addselectionlistener(new SelectionAdapter() { public void widgetselected(selectionevent e) { int oldnum = Integer.parseInt(texts[j].getText()); int newnum = oldnum * j; texts[j].settext(integer.tostring(newnum)); ); private static void addlisteners3() { buttons[0].addselectionlistener(new InnerHandler()); buttons[0].addselectionlistener(new InnerHandler()); buttons[0].addselectionlistener(new InnerHandler()); buttons[1].addselectionlistener(new InnerHandler()); buttons[1].addselectionlistener(new InnerHandler()); buttons[2].addselectionlistener(new InnerHandler()); private static class InnerHandler extends SelectionAdapter { public void widgetselected(selectionevent e) { for (int i=0; i<n; i++) { nums[i]++; texts[i].settext(integer.tostring(nums[i])); // end of class
עמוד 14 מתוך 11 מספר סידורי: בכל השאלות הבאות יש לסמן את התשובה שמתאימה למצב מסך מסויים. המצבים וההתאמה שלהם לתשובות מופיעים לאחר השאלות. כיצד יראה החלון לאחר הרצת התוכנית ולחיצה על שלושת הכפתורים משמאל לימין אם הקוד החסר הוא addlisteners1() כיצד יראה החלון לאחר הרצת התוכנית ולחיצה על הכפתור השמאלי שלוש פעמים אם הקוד החסר הוא addlisteners1() כיצד יראה החלון לאחר הרצת התוכנית ולחיצה על שלושת הכפתורים משמאל לימין אם הקוד החסר הוא addlisteners5() שאלה )4 14 נק'( כיצד יראה החלון לאחר הרצת התוכנית ולחיצה על שלושת הכפתורים משמאל לימין אם הקוד החסר הוא addlisteners3()
עמוד 12 מתוך 11 מספר סידורי: מפתח תשובות ל- 4 השאלות הקודמות: א. ב. 1 1 5 1 1 1 0 0 1 2 0 0 1 2 ג. ד. 1 5 3 1 5 4 0 0 1 2 0 0 1 2 ה. ו. 5 5 5 3 1 5 0 0 1 2 0 0 1 2 ז. ח. 3 5 1 1 1 4 0 0 1 2 0 0 1 2 ט. י. 1 1 1 3 3 3 0 0 1 2 0 0 1 2
עמוד 11 מתוך 11 מספר סידורי: 4 השאלות הבאות )נקודה אחת לכל שאלה( מתייחסות לקוד הבא. בשאלה הזאת יש לנמק רק במקרה שאתם עונים שהקוד לא מתקמפל. public class Test { public interface If { public class A implements If { public class B extends A { public class Helper<T> { public Helper(T arg) { private void test() { Helper<If> h1 = new Helper<If>(new A()); Helper<If> h2 = new Helper<If>(new B()); Helper<If> h3 = new Helper<A> (new A()); Helper<A> h4 = new Helper<A> (new B()); שאלה 11: השורה שמגדירה את h1 מתקמפלת א. אינה מתקמפלת ב. שאלה 11: השורה שמגדירה את h2 מתקמפלת א. אינה מתקמפלת ב. שאלה 11: השורה שמגדירה את h3 מתקמפלת א. אינה מתקמפלת ב. שאלה 11: השורה שמגדירה את h4 מתקמפלת א. אינה מתקמפלת ב. נימוק לתשובה ב': נימוק לתשובה ב': נימוק לתשובה ב': נימוק לתשובה ב':